<html>
<head>
  <script src="../OLLoader.js"></script>
  <script type="text/javascript">
    var polygon;
    var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
    var components2 = [new OpenLayers.Geometry.Point(12,15), new OpenLayers.Geometry.Point(2,3), new OpenLayers.Geometry.Point(10,0), new OpenLayers.Geometry.Point(10,10)];
    var linearRing = new OpenLayers.Geometry.LinearRing(components);
    var linearRing2 = new OpenLayers.Geometry.LinearRing(components2);
    
    function test_Polygon_constructor (t) {
        t.plan( 3 );
        polygon = new OpenLayers.Geometry.Polygon();
        t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
        t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
        t.eq( polygon.components.length, 0, "polygon.components is set correctly");
    }

    function test_Polygon_constructor (t) {
        t.plan( 3 );
        polygon = new OpenLayers.Geometry.Polygon([linearRing]);
        t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
        t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
        t.eq( polygon.components.length, 1, "polygon.components.length is set correctly");
    }
    
    function test_Polygon_constructor (t) {
        t.plan( 3 );
        polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
        t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
        t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
        t.eq( polygon.components.length, 2, "polygon.components.length is set correctly");
    }
    
    function test_Polygon_transform_getBounds (t) {
        t.plan(3);

        var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
        var linearRing = new OpenLayers.Geometry.LinearRing(components);
        polygon = new OpenLayers.Geometry.Polygon([linearRing.clone()]);
        polygon.calculateBounds();
        t.ok( polygon.bounds != null, "bounds calculated by calcBounds" );
        polygon.transform(new OpenLayers.Projection("EPSG:4326"), 
                        new OpenLayers.Projection("EPSG:900913"));
        t.eq(polygon.bounds, null, "Point bounds cleared after transform");
        t.eq(polygon.getBounds().toBBOX(), "556597.453889,334111.171355,1113194.907778,1574216.547942", "Bounds are correct")
    }

    function test_Polygon_transform_string (t) {
        t.plan(3);

        var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
        var linearRing = new OpenLayers.Geometry.LinearRing(components);
        polygon = new OpenLayers.Geometry.Polygon([linearRing.clone()]);
        polygon.calculateBounds();
        t.ok( polygon.bounds != null, "bounds calculated by calcBounds" );
        polygon.transform("EPSG:4326", "EPSG:900913");
        t.eq(polygon.bounds, null, "Point bounds cleared after transform");
        t.eq(polygon.getBounds().toBBOX(), "556597.453889,334111.171355,1113194.907778,1574216.547942", "Bounds are correct")
    }

    function test_Polygon_getArea(t) {
        t.plan( 5 );

      //no components
        var polygon = new OpenLayers.Geometry.Polygon();
        t.eq(polygon.getArea(), 0, "getArea empty polygon is 0");

        var createSquareRing = function(area) {
            var points = [
                new OpenLayers.Geometry.Point(0, 0),
                new OpenLayers.Geometry.Point(0, area),
                new OpenLayers.Geometry.Point(area, area),
                new OpenLayers.Geometry.Point(area, 0)
            ];
            var ring = new OpenLayers.Geometry.LinearRing(points);
            return ring;
        };
    

      //simple polygon
        var comps = [ createSquareRing(2) ];
        
        var polygon = new OpenLayers.Geometry.Polygon(comps);
        t.eq(polygon.getArea(), 4, "getArea simple polygon works lovely");

      //polygon with holes
        comps = [ createSquareRing(10),
                           createSquareRing(2),
                           createSquareRing(3),
                           createSquareRing(4)
                         ];

        var polygon = new OpenLayers.Geometry.Polygon(comps);
        t.eq(polygon.getArea(), 71, "getArea polygon with holes works lovely");
        
      //simple polygon negative
        comps = [ createSquareRing(-2) ];
        
        var polygon = new OpenLayers.Geometry.Polygon(comps);
        t.eq(polygon.getArea(), 4, "getArea simple polygon negative works lovely");

      //polygon with holes negative
        comps = [ createSquareRing(-10),
                           createSquareRing(-2),
                           createSquareRing(-3),
                           createSquareRing(-4)
                         ];
        
        var polygon = new OpenLayers.Geometry.Polygon(comps);
        t.eq(polygon.getArea(), 71, "getArea negative polygon with holes works lovely");
        
    }
    
    function test_Polygon_move(t) {
        t.plan(4);
        
        polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
        
        var x = linearRing.components[0].x;
        var y = linearRing.components[0].y;
        var x2 = linearRing2.components[0].x;
        var y2 = linearRing2.components[0].y;
        
        var dx = 10 * Math.random();
        var dy = 10 * Math.random();

        polygon.move(dx, dy);

        t.eq(polygon.components[0].components[0].x, x + dx, "move() correctly modifies first x");
        t.eq(polygon.components[0].components[0].y, y + dy, "move() correctly modifies first y");
        t.eq(polygon.components[1].components[0].x, x2 + dx, "move() correctly modifies second x");
        t.eq(polygon.components[1].components[0].y, y2 + dy, "move() correctly modifies second y");
    }

    function test_Polygon_rotate(t) {
        t.plan(6);
        
        var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
        
        var originals = [];
        var comp;
        var angle = 2 * Math.PI * Math.random();
        var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
                                                   10 * Math.random());
        for(var i=0; i<geometry.components.length; ++i) {
            comp = geometry.components[i];
            originals[i] = comp.rotate;
            comp.rotate = function(a, o) {
                t.ok(true, "rotate called for component " + i);
                t.ok(a == angle, "rotate called with correct angle");
                t.ok(o == origin, "rotate called with correct origin");
            }
        }
        geometry.rotate(angle, origin);
        
        // restore the original rotate defs
        for(var i=0; i<geometry.components.length; ++i) {
            comp.rotate = originals[i];
        }
    }

    function test_Polygon_resize(t) {
        t.plan(8);
        
        var tolerance = 1e-10;
        var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
        var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
                                                   10 * Math.random());
        var scale = 10 * Math.random();
        
        var oldArea = geometry.getArea();
        var oldPerimeter = geometry.getLength();
        geometry.resize(scale, origin);
        var newArea = geometry.getArea();
        var newPerimeter = geometry.getLength();
        
        t.ok((((newArea / oldArea) - (scale * scale)) / (scale * scale)) < tolerance,
             "resize correctly changes the area of a polygon")
        t.ok((((newPerimeter / oldPerimeter) - scale) / scale) < tolerance,
             "resize correctly changes the perimeter of a polygon")

        var originals = [];
        var comp;
        for(var i=0; i<geometry.components.length; ++i) {
            comp = geometry.components[i];
            originals[i] = comp.resize;
            comp.resize = function(s, o) {
                t.ok(true, "resize called for component " + i);
                t.ok(s == scale, "resize called with correct scale");
                t.ok(o == origin, "resize called with correct origin");
            }
        }
        geometry.resize(scale, origin);
        
        // restore the original resize defs
        for(var i=0; i<geometry.components.length; ++i) {
            comp.resize = originals[i];
        }
        
    }

    function test_Polygon_createRegular(t) {
        t.plan(22);
        var sides = 40;
        var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
        var polyBounds = poly.getBounds();
        t.eq(polyBounds.toBBOX(), "-0.981504,-5.981504,10.981504,5.981504", sides + " sided figure generates correct bbox.");
        t.eq(poly.components.length, 1, "Poly has one linear ring");
        t.eq(poly.components[0].components.length, sides + 1, "ring has 41 components");
        t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
        t.eq(Math.round(poly.getArea()), Math.round(Math.PI * 36), "area of "+sides+" sided poly rounds to same area as a circle.");
        
        var sides = 3;
        var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
        var polyBounds = poly.getBounds();
        t.eq(polyBounds.toBBOX(), "-0.196152,-3,10.196152,6", sides + " sided figure generates correct bbox.");
        t.eq(poly.components.length, 1, "Poly has one linear ring");
        t.eq(poly.components[0].components.length, sides + 1, "ring has  correct count of  components");
        t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
        t.eq(Math.round(poly.getArea()), 47, "area of 3 sided poly is correct");
        
        var sides = 3;
        var poly3 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
        var polyBounds = poly3.getBounds();
        t.eq(polyBounds.toBBOX(), "-2.990381,-7.5,22.990381,15", sides + " sided figure generates correct bbox.");
        t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
        t.eq(poly3.components.length, 1, "Poly has one linear ring");
        t.eq(poly3.components[0].components.length, sides + 1, "ring has  correct count of  components");
        t.eq(poly3.components[0].components[0].id, poly3.components[0].components[sides].id, "ring starts and ends with same geom");
        t.ok(poly3.getArea() > poly.getArea(), "area with radius 15 > poly with radius 6"); 
        
        var sides = 4;
        var poly4 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
        var polyBounds = poly4.getBounds();
        t.eq(polyBounds.toBBOX(), "-0.606602,-10.606602,20.606602,10.606602", sides + " sided figure generates correct bbox.");
        t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
        t.eq(poly4.components.length, 1, "Poly has one linear ring");
        t.eq(poly4.components[0].components.length, sides + 1, "ring has  correct count of  components");
        t.eq(poly4.components[0].components[0].id, poly4.components[0].components[sides].id, "ring starts and ends with same geom");
        t.ok(poly4.getArea() > poly3.getArea(), "square with radius 15 > triangle with radius 15"); 
    }

    function test_Polygon_equals(t) {
        t.plan(3);
        
        var x0 = Math.random() * 100;
        var y0 = Math.random() * 100;
        var x1 = Math.random() * 100;
        var y1 = Math.random() * 100;
        var x2 = Math.random() * 100;
        var y2 = Math.random() * 100;
        var point0 = new OpenLayers.Geometry.Point(x0, y0);
        var point1 = new OpenLayers.Geometry.Point(x1, y1);
        var point2 = new OpenLayers.Geometry.Point(x2, y2);
        var pointX = new OpenLayers.Geometry.Point(x0 + 1, y0);
        var pointY = new OpenLayers.Geometry.Point(x0, y0 + 1);
        var geometry = new OpenLayers.Geometry.Polygon([
                            new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
        var equal = new OpenLayers.Geometry.Polygon([
                            new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
        var offX = new OpenLayers.Geometry.Polygon([
                            new OpenLayers.Geometry.LinearRing([pointX, point1, point2])]);
        var offY = new OpenLayers.Geometry.Polygon([
                            new OpenLayers.Geometry.LinearRing([pointY, point1, point2])]);
        t.ok(geometry.equals(equal),
             "equals() returns true for a geometry with equivalent coordinates");
        t.ok(!geometry.equals(offX),
             "equals() returns false for a geometry with offset x");
        t.ok(!geometry.equals(offY),
             "equals() returns false for a geometry with offset y");
    }
    
    function test_distanceTo(t) {
        var wkt = OpenLayers.Geometry.fromWKT;
        var geoms = [
            wkt("POLYGON((0 3, 1 4, 2 3, 1 2, 0 3))"),
            wkt("POINT(0 0)"),
            wkt("LINESTRING(-2 0, 0 -2, 2 -1, 2 0)"),
            wkt("LINESTRING(0 2, 1 3)"),
            wkt("POINT(1 3)")
        ];

        var cases = [{
            got: geoms[0].distanceTo(geoms[1]),
            expected: Math.sqrt(5)
        }, {
            got: geoms[0].distanceTo(geoms[1], {details: true}),
            expected: {
                distance: Math.sqrt(5),
                x0: 1, y0: 2,
                x1: 0, y1: 0
            }
        }, {
            got: geoms[0].distanceTo(geoms[2], {details: true}),
            expected: {
                distance: Math.sqrt(5),
                x0: 1, y0: 2,
                x1: 2, y1: 0
            }
        }, {
            got: geoms[0].distanceTo(geoms[3], {details: true}),
            expected: {
                distance: 0,
                x0: 0.5, y0: 2.5,
                x1: 0.5, y1: 2.5
            }
        }, {
            got: geoms[0].distanceTo(geoms[4]),
            expected: Math.sqrt(0.5)
        }, {
            got: geoms[0].distanceTo(geoms[4], {edge: false}),
            expected: 0
        }];

        t.plan(cases.length);
        for(var i=0; i<cases.length; ++i) {
            t.eq(cases[i].got, cases[i].expected, "case " + i);
        }
        
    }

    function test_getVertices(t) {
        t.plan(6);
        
        var points = [
            new OpenLayers.Geometry.Point(10, 20),
            new OpenLayers.Geometry.Point(20, 30),
            new OpenLayers.Geometry.Point(30, 40),
            new OpenLayers.Geometry.Point(40, 50)
        ];
        var polygon = new OpenLayers.Geometry.Polygon([
            new OpenLayers.Geometry.LinearRing(points)
        ]);
        
        var verts = polygon.getVertices();
        t.ok(verts instanceof Array, "got back an array");
        t.eq(verts.length, points.length, "of correct length length");
        t.geom_eq(verts[0], points[0], "0: correct geometry");
        t.geom_eq(verts[1], points[1], "1: correct geometry");
        t.geom_eq(verts[2], points[2], "2: correct geometry");
        t.geom_eq(verts[3], points[3], "3: correct geometry");
        
    }

    function test_Polygon_clone(t) {
        t.plan(2);
        
        var x0 = Math.random() * 100;
        var y0 = Math.random() * 100;
        var x1 = Math.random() * 100;
        var y1 = Math.random() * 100;
        var x2 = Math.random() * 100;
        var y2 = Math.random() * 100;
        var point0 = new OpenLayers.Geometry.Point(x0, y0);
        var point1 = new OpenLayers.Geometry.Point(x1, y1);
        var point2 = new OpenLayers.Geometry.Point(x2, y2);
        var geometry = new OpenLayers.Geometry.Polygon([
                            new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
        var clone = geometry.clone();
        t.ok(clone instanceof OpenLayers.Geometry.Polygon,
             "clone() creates an OpenLayers.Geometry.Polygon");
        t.ok(geometry.equals(clone), "clone has equivalent coordinates");
    }
    
    function test_getGeodesicArea(t) {
        
        t.plan(1);
        
        // from the wfs-states.html example
        var illinois = OpenLayers.Geometry.fromWKT(
            "MULTIPOLYGON(((-88.071564 37.51099,-88.087883 37.476273,-88.311707 37.442852,-88.359177 37.409309,-88.419853 37.420292,-88.467644 37.400757,-88.511322 37.296852,-88.501427 37.257782,-88.450699 37.205669,-88.422516 37.15691,-88.45047 37.098671,-88.476799 37.072144,-88.4907 37.06818,-88.517273 37.06477,-88.559273 37.072815,-88.61422 37.109047,-88.68837 37.13541,-88.739113 37.141182,-88.746506 37.152107,-88.863289 37.202194,-88.932503 37.218407,-88.993172 37.220036,-89.065033 37.18586,-89.116821 37.112137,-89.146347 37.093185,-89.169548 37.064236,-89.174332 37.025711,-89.150246 36.99844,-89.12986 36.988113,-89.193512 36.986771,-89.210052 37.028973,-89.237679 37.041733,-89.264053 37.087124,-89.284233 37.091244,-89.303291 37.085384,-89.3097 37.060909,-89.264244 37.027733,-89.262001 37.008686,-89.282768 36.999207,-89.310982 37.009682,-89.38295 37.049213,-89.37999 37.099083,-89.423798 37.137203,-89.440521 37.165318,-89.468216 37.224266,-89.465309 37.253731,-89.489594 37.256001,-89.513885 37.276402,-89.513885 37.304962,-89.50058 37.329441,-89.468742 37.339409,-89.435738 37.355717,-89.427574 37.411018,-89.453621 37.453186,-89.494781 37.491726,-89.524971 37.571957,-89.513367 37.615929,-89.51918 37.650375,-89.513374 37.67984,-89.521523 37.694798,-89.581436 37.706104,-89.666458 37.745453,-89.675858 37.78397,-89.691055 37.804794,-89.728447 37.840992,-89.851715 37.905064,-89.861046 37.905487,-89.866814 37.891876,-89.900551 37.875904,-89.937874 37.878044,-89.978912 37.911884,-89.958229 37.963634,-90.010811 37.969318,-90.041924 37.993206,-90.119339 38.032272,-90.134712 38.053951,-90.207527 38.088905,-90.254059 38.122169,-90.289635 38.166817,-90.336716 38.188713,-90.364769 38.234299,-90.369347 38.323559,-90.358688 38.36533,-90.339607 38.390846,-90.301842 38.427357,-90.265785 38.518688,-90.26123 38.532768,-90.240944 38.562805,-90.183708 38.610271,-90.183578 38.658772,-90.20224 38.700363,-90.196571 38.723965,-90.163399 38.773098,-90.135178 38.785484,-90.121727 38.80051,-90.113121 38.830467,-90.132812 38.853031,-90.243927 38.914509,-90.278931 38.924717,-90.31974 38.924908,-90.413071 38.96233,-90.469841 38.959179,-90.530426 38.891609,-90.570328 38.871326,-90.627213 38.880795,-90.668877 38.935253,-90.70607 39.037792,-90.707588 39.058178,-90.690399 39.0937,-90.716736 39.144211,-90.718193 39.195873,-90.732338 39.224747,-90.738083 39.24781,-90.779343 39.296803,-90.850494 39.350452,-90.947891 39.400585,-91.036339 39.444412,-91.064384 39.473984,-91.093613 39.528927,-91.156189 39.552593,-91.203247 39.600021,-91.317665 39.685917,-91.367088 39.72464,-91.373421 39.761272,-91.381714 39.803772,-91.449188 39.863049,-91.450989 39.885242,-91.434052 39.901829,-91.430389 39.921837,-91.447243 39.946064,-91.487289 40.005753,-91.504005 40.066711,-91.516129 40.134544,-91.506546 40.200459,-91.498932 40.251377,-91.486694 40.309624,-91.448593 40.371902,-91.418816 40.386875,-91.385757 40.392361,-91.372757 40.402988,-91.385399 40.44725,-91.374794 40.503654,-91.382103 40.528496,-91.412872 40.547993,-91.411118 40.572971,-91.37561 40.603439,-91.262062 40.639545,-91.214912 40.643818,-91.162498 40.656311,-91.129158 40.682148,-91.119987 40.705402,-91.092751 40.761547,-91.088905 40.833729,-91.04921 40.879585,-90.983276 40.923927,-90.960709 40.950504,-90.954651 41.070362,-90.957787 41.104359,-90.990341 41.144371,-91.018257 41.165825,-91.05632 41.176258,-91.101524 41.231522,-91.102348 41.267818,-91.07328 41.334896,-91.055786 41.401379,-91.027489 41.423508,-91.000694 41.431084,-90.949654 41.421234,-90.844139 41.444622,-90.7799 41.449821,-90.708214 41.450062,-90.658791 41.462318,-90.6007 41.509586,-90.54084 41.52597,-90.454994 41.527546,-90.434967 41.543579,-90.423004 41.567272,-90.348366 41.586849,-90.339348 41.602798,-90.341133 41.64909,-90.326027 41.722736,-90.304886 41.756466,-90.25531 41.781738,-90.195839 41.806137,-90.154518 41.930775,-90.14267 41.983963,-90.150536 42.033428,-90.168098 42.061043,-90.166649 42.103745,-90.176086 42.120502,-90.191574 42.122688,-90.230934 42.159721,-90.323601 42.197319,-90.367729 42.210209,-90.407173 42.242645,-90.417984 42.263924,-90.427681 42.340633,-90.441597 42.360073,-90.491043 42.388783,-90.563583 42.421837,-90.605827 42.46056,-90.648346 42.475643,-90.651772 42.494698,-90.638329 42.509361,-90.419975 42.508362,-89.923569 42.504108,-89.834618 42.50346,-89.400497 42.49749,-89.359444 42.497906,-88.939079 42.490864,-88.764954 42.490906,-88.70652 42.489655,-88.297897 42.49197,-88.194702 42.489613,-87.79731 42.489132,-87.836945 42.314213,-87.760239 42.156456,-87.670547 42.059822,-87.612625 41.847332,-87.529861 41.723591,-87.532646 41.469715,-87.532448 41.301304,-87.531731 41.173756,-87.532021 41.00993,-87.532669 40.745411,-87.53717 40.49461,-87.535675 40.483246,-87.535339 40.166195,-87.535774 39.887302,-87.535576 39.609341,-87.538567 39.477448,-87.540215 39.350525,-87.597664 39.338268,-87.625237 39.307404,-87.610619 39.297661,-87.615799 39.281418,-87.606895 39.258163,-87.584564 39.248753,-87.588593 39.208466,-87.594208 39.198128,-87.607925 39.196068,-87.644257 39.168507,-87.670326 39.146679,-87.659454 39.130653,-87.662262 39.113468,-87.631668 39.103943,-87.630867 39.088974,-87.612007 39.084606,-87.58532 39.062435,-87.581749 38.995743,-87.591858 38.994083,-87.547905 38.977077,-87.53347 38.963703,-87.530182 38.931919,-87.5392 38.904861,-87.559059 38.869812,-87.550507 38.857891,-87.507889 38.795559,-87.519028 38.776699,-87.508003 38.769722,-87.508316 38.736633,-87.543892 38.685974,-87.588478 38.672169,-87.625191 38.642811,-87.628647 38.622917,-87.619827 38.599209,-87.640594 38.593178,-87.652855 38.573872,-87.672943 38.547424,-87.65139 38.515369,-87.653534 38.500443,-87.679909 38.504005,-87.692818 38.481533,-87.756096 38.466125,-87.758659 38.457096,-87.738953 38.44548,-87.748428 38.417965,-87.784019 38.378124,-87.834503 38.352524,-87.850082 38.286098,-87.863007 38.285362,-87.874039 38.316788,-87.883446 38.315552,-87.888466 38.300659,-87.914108 38.281048,-87.913651 38.302345,-87.925919 38.304771,-87.980019 38.241085,-87.986008 38.234814,-87.977928 38.200714,-87.932289 38.171131,-87.931992 38.157528,-87.950569 38.136913,-87.973503 38.13176,-88.018547 38.103302,-88.012329 38.092346,-87.964867 38.096748,-87.975296 38.073307,-88.034729 38.054085,-88.043091 38.04512,-88.041473 38.038303,-88.021698 38.033531,-88.029213 38.008236,-88.021706 37.975056,-88.042511 37.956264,-88.041771 37.934498,-88.064621 37.929783,-88.078941 37.944,-88.084 37.92366,-88.030441 37.917591,-88.026588 37.905758,-88.044868 37.896004,-88.100082 37.90617,-88.101456 37.895306,-88.075737 37.867809,-88.034241 37.843746,-88.042137 37.827522,-88.089264 37.831249,-88.086029 37.817612,-88.035576 37.805683,-88.072472 37.735401,-88.133636 37.700745,-88.15937 37.660686,-88.157631 37.628479,-88.134171 37.583572,-88.071564 37.51099)))"
        );
        
        // two calculations of the area (in square meters)
        var planar = illinois.getArea() * Math.pow(OpenLayers.INCHES_PER_UNIT['dd'] / OpenLayers.INCHES_PER_UNIT['m'], 2);
        var geodesic = illinois.getGeodesicArea();
        
        // from http://en.wikipedia.org/wiki/Illinois
        var expected = 1.40998e11; // square meters
        
        var planarErr = Math.abs(planar - expected) / expected;
        var geodesicErr = Math.abs(geodesic - expected) / expected;
        
        t.ok(geodesicErr < planarErr, "geodesic measure is better (" + geodesicErr.toFixed(3) + " vs. " + planarErr.toFixed(3) + ")");
        
    }
    

  </script>
</head>
<body>
</body>
</html>
